#ifndef __LoadControllerListed_H__
#define __LoadControllerListed_H__

#include "LoadControlledObject.h"
#include "LoadController.h"
#include <exception/Null.h>

#include "LoadControlledObject.h"


class LoadControllerListed:public LoadController{
private:
	irr::core::array<LoadControlledObject*> list;
	irr::u32 currentCheckObjectIndex;
protected:
	irr::s32 indexOf(LoadControlledObject*obj){
		for (irr::u32 i=0;i<list.size();i++)
			if (list[i]==obj)
				return i;
		return -1;
	}

	void remove(irr::u32 index){
		list[index]->drop();
		list.erase(index);
	}

	/***
	 * Должена проверять объект на загруженность
	 *
	 * @param obj указатель на объект
	 * @param index номер объекта
	 * */
	virtual void checkObject(LoadControlledObject*obj,irr::u32 index)=0;
public:
	LoadControllerListed(){
		currentCheckObjectIndex=0;
	}
	virtual void addToTracking(LoadControlledObject*obj){
		CHECKNULL(obj);
		obj->grab();
		list.push_back(obj);
	}

	virtual void removeFromTracking(LoadControlledObject*obj){
		irr::s32 index=indexOf(obj);
		if (obj<0)
			return;
		remove(index);
	}

	virtual void removeAllTracking(){
		for (irr::u32 i=0;i<list.size();i++)
			list[i]->drop();
		list.clear();
	};

	/***
	 * Проверяет каждый элемент по списку. Если проверять нечего (кончились объекты), то должна вернуть FALSE
	 * */
	virtual bool checkNext(){
		if (currentCheckObjectIndex>=list.size())
			return false;
		checkObject(list[currentCheckObjectIndex],currentCheckObjectIndex);
		currentCheckObjectIndex++;
		return true;
	}

	/***
	 * Должна устанавить счётчик проверки в самое начало
	 * */
	virtual void resetCheck(){
		currentCheckObjectIndex=0;
	}
};

#endif
